FHS(Filesystem Hierarchy Standard)とは、Daniel Quinlan氏らによってまとめられ提唱されているディレクトリ構成を示したファイルの標準化仕様書です。
FHSは、ディレクトリ構造を示すだけでなく、ディレクトリの用途やどのようなファイルをどのディレクトリに配置すべきかなどまで示されています。そのため、OSの各種設定をするときに役立つばかりか、RPMパッケージではなくソースファイル(.tar.gz形式のファイル)をダウンロードしてアプリケーションをインストールしなければならない場合でも、どのディレクトリに保存するのが適切かを理解する上でも参考になります。
(1)システムに必須のファイル
ディレクトリには、システムが起動するために必須なものがまとめられているものがあります。例えば、カーネルイメージは必須なものの1つであり、/etcディレクトリに保存されるファイルは、このシステム自身の設定ファイル群であって起動するために不可欠です。
また/binディレクトリや/sbinディレクトリには、システムの構築時やシステムのリカバリ時に必要なファイルが含まれています。このため、システムが起動する時点で利用できるよう用意されていることが必要です。
そこでFHSでは、次のディレクトリをシステムに必須のファイルを格納する場所として定義しています。
/bin、/boot、/dev、/etc、/lib、/medis、/mnt、
/opt、/sbin、/srv、/tmp、/usr、/var
名前 | 説明 | |
/bin | 必須 | 一般ユーザー権限で実行できる必須コマンドを格納するディレクトリです。いかなるサブディレクトリも作成しません。 他のファイルシステムがマウントされていないシングルユーザモードであってもこれらのコマンドは使える状態でなければなりません。 |
/boot | 必須 | ブートに必要なファイルが含まれます。 カーネルがユーザモードでのプログラムを実行し始める前にデータを保管するディレクトリでもあります。カーネルは/(ルート)か/boot のどちらかに置くこととされています。 |
/dev | 必須 | デバイスファイル、その他スペシャルファイルが置かれます。 |
/etc | 必須 | システムの設定ファイルが置かれます(xxx.conf など) プログラムの操作や制御を行う際に必要となる設定ファイルが /etc 階層に配置されます。関連する設定ファイルが多い場合は、/etc 配下にサブディレクトリを作成し、その中に配置する場合もあります。ファイルは必ず静的なものであり、実行可能なバイナリファイルを置いてはいけません。 |
/lib | 必須 | /bin/ や /sbin/ にある実行ファイルの基本となる共有ライブラリ (library) 群の置き場。 |
/media | 必須 | リムーバブルメディアのためのマウントポイント フロッピーディスクやCD-ROM、ZIPディスクなどのリムーバブルメディアをマウントするためのサブディレクトリを含みます |
/mnt | 必須 | 一時的にファイルシステムをマウントするためのディレクトリです。 |
/opt | 必須 | オプション (option) のアプリケーションソフトウェアパッケージのインストール用 |
/sbin | 必須 | システム管理用のコマンドが置かれます。ブートやシステムのリカバリに必要となる実行ファイルが収められているディレクトリです。 通常、一般ユーザが使う必要のない実行ファイルがここには置かれ、それ以外は /bin に設置されます。shutdown、ifconfig reboot、route、fdisk、fsckなど。 |
/srv | 必須 | システムによって提供されるサービスデータの保存場所 |
/tmp | 必須 | 一時的な作業用ディレクトリ(temporary files)で、リブート時にクリアされます。ユーザに関らず使えるディレクトリですが、ディレクトリやファイルが存在し続けることを想定してはいけません。 |
/usr | 必須 | ユーザーが共有する読み出し専用の領域です。 |
/var | 必須 | ログファイルや作業用ファイルを格納する領域です。 スプールディレクトリやファイル、管理用のログデータ、一時利用などが含まれます。/tmp と違い、リブート時に削除されることはありません。 |
/home | ユーザーのホームディレクトリです。/home下にユーザーごとのディレクトリが作成されます。 可能であれば当ディレクトリは独立したパーティションにしておく方が良い |
|
/root | rootのホームディレクトリです。ここには、通常サブディレクトリは作成しないようにします。 | |
/proc | カーネル内の情報へアクセスするためのインターフェースとして使用されます。カーネルから情報を取り込むか、あるいは、カーネルに情報を送る特別なファイルを収納しています。その情報の例としては、システムメモリー、cpu 情報、及びハードウェア設定などがあります。ファイルシステムは擬似的なファイルシステムです。 | |
find コマンドは、ファイル名やファイルの種類、最終更新日のようなファイルの属性をもとにファイルの検索をおこないます。また、検索したファイルに対してコマンドを実行することができます。
● find コマンド構文
find [検索開始ディレクトリ] [検索条件] [コマンド] |
|
※検索開始ディレクトリの省略も可能。この場合カレントディレクトリが検索開始ディレクトリとみなされる。
● find 検索条件-name ファイル名 | 指定されたファイル名を検索する |
-perm num | パーミッションがnum(8進数)で指定されたものと一致するものを検索する |
-type タイプ | ファイルのタイプが指定されたものと一致するファイルを検索する b:ブロックデバイス c:キャラクタデバイス d:ディレクトリ f:ファイル l:シンボリックリンク p:名前付きパイプ |
-user ユーザーID | 所有者がユーザーIDで指定されたものと一致するファイルを検索する |
-group グループ | ファイルがグループで指定されたグループに属しているファイルを検索する |
-size [+-]num[c] | ブロックサイズまたはファイルサイズで検索する。「-size 100」だとブロックサイズとみなし、「-size 100c」などと末尾に c をつけるとファイルサイズとみなす。 |
-atime [+-]num | num日前に最終アクセスがあったファイルを検索する -atime 4 4日前にアクセスされたファイル -atime +4 5日以前にアクセスされたファイル -atime -4 3日以内にアクセスされたファイル |
-mtime [+-]num | num日前に最終更新されたファイルを検索する -mtime 4 ちょうど4日前に修正されたファイル -mtime +4 5日以前に修正されたファイル -mtime -4 3日以内に修正されたファイル |
-empty | 空のファイルやディレクトリを検索する |
数字を判別式として用いる場合、数字の前に「+」をつけると、num以上の数が検索対象となり、「-」をつけるとnum以下の数が検索対象となる。また、何もつけないと、等しいファイルが検索対象になる。
● find コマンド検索結果をフルパスで標準出力する | |
-ls | 検索結果をパス名など、ls -gildsに相当する情報を表示する |
-exec command \; | 検索後、コマンドcommandを実行する。検索結果をcommandに引き渡すには{}を用いる。 例:find ~ -name '*bak" -exec rm {} \; 上記の例で-execにつづくrm {} \;が実行されるコマンド。最後の";"は-execのパラメタの終わりを示しており、その前の"\"は、";"がシェルに解釈されないようにエスケープする為のもの。 |
-ok command \; | -execと同じ。ただし、コマンドの実行前にユーザに確認する |
ホームディレクトリ以下の拡張子shtmlのファイルをファイル詳細付きで検索する
$ find ~/ -name "*.html" -ls |
2754565 4 -rwxr-xr-x 1 root root 3135 5月 19 2006 /root/.local/share/Trash/files/LPIC/Zkougi/search/search.html 2755495 4 -rwxr-xr-x 1 root root 3135 5月 19 2006 /root/.local/share/Trash/files/LPIC/kougi/search/search.html |
コマンド入力する際に、環境変数PATHが設定されていないために、フルパスで入力しなければならない時があります。しかし、そのコマンドのフルパスがわからない場合は、which コマンドでフルパスを確認することができます。
ただし、環境変数PATH に設定されていないディレクトリは検索対象からははずれるため、一般ユーザーが管理用のコマンドを検索することはできないことになります。
# which useradd /usr/sbin/useradd |
whereis コマンドは、指定したコマンドのバイナリファイル、ソースファイル、マニュアルなどが格納されているディレクトリを表示するコマンドです。
# whereis useradd useradd: /usr/sbin/useradd /usr/share/man/man8/useradd.8.gz |
-b | バイナリファイルの場所のみ表示する |
-m | マニュアルが格納されている場所のみ表示する |
-s | ソースファイルの場所のみ表示する |
type コマンドは、シェルがどのコマンドを起動しているかを確認するコマンドです。
type [オプション] コマンド名 |
|
-a | 同名で実行可能なコマンドを全て表示する |
-f | シェル関数は除外する |
-P | PATH内のみを探す(whichコマンドと同じ結果になる) |
-p | 実行されるコマンドのディスク上のファイル名を表示する(例えば、ビルトインコマンドの場合は何も表示されない) |
-t | 実行されるコマンドに応じて「alias」「keyword」「function」「builtin」「file」を表示する。該当するコマンドが見つからない場合は何も表示しない |
コマンドラインで入力したときに何が実行されているのかを調べることができます。
# type ls ls は `ls --color=auto' のエイリアスです |
同じ名前のコマンドが複数の場所にあるときには、「type -a コマンド名」で全てを表示することができます
# type -a ls ls は `ls --color=auto' のエイリアスです ls は /usr/bin/ls です |
locate コマンドは、あらかじめ作成されているデータベースを参照して、ファイル及びディレクトリを検索するコマンドです。既にデータベースが作成されている中から検索をかけるため、find コマンドよりも高速に特定のファイルを見つけ出す事ができます。ただし、欠点もあります。それは、データベースの情報が最新でなければ、検索にひっかからないということです。そのため、新規にファイルやディレクトリを作成したり、ソフトウェアをインストールした際には、その都度 updatedb コマンドを使用して、データベースを最新の状態にしておく必要があります。また、その逆も考えられます。データベースが最新でないと、既に削除したファイルなのに、検索するとマッチしてしまいます。実際に見てみるとそのファイルは存在しなかったということもあります。もし、現在の状態からファイルを検索したいのなら、find コマンドを使用する事になります。
なお、現在では、locate コマンドは、slocate コマンドへシンボリックリンクが貼られているため、実際には、slocate コマンドを実行していることになります。slocate
コマンドは、データベース内に所有者情報やパーミッションの情報も含まれるため、読み取り権限のないユーザーなどが
locate コマンドを実行しても検索にはひっかからないようになっています。これによって、よりセキュリティが向上してします。因みに、slocate
データベースは、/var/lib/slocate/slocate.db に格納されています。
# ls -la /usr/bin/locate lrwxrwxrwx 1 root slocate 7 2月 3 04:33 /usr/bin/locate -> slocate |
それでは、実際に解説に移ります。まず、updatedb コマンドを使用してデータベースを最新状態に更新します。なお、updatedb
コマンドを使用できるのはスーパーユーザーのみです。
# updatedb |
updatedb をバックグラウンドで実行するには、& を付け加えます。
# updatedb & |
なお、updatedb コマンドは、cron によって1日に1回、シェルスクリプトによって定期的に実行されるようになっています。
# cat /etc/cron.daily/slocate.cron #!/bin/sh renice +19 -p $$ >/dev/null 2>&1 /usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e "/tmp,/var/tmp,/usr/tmp,/afs,/net" |
updatedb コマンドの処理が終えたら、ようやく、locate コマンドを使って検索できるようになります。なお、2度目にupdatedb
コマンドを使用する場合には、一度目より早く終了します。以下例は、httpd.conf にマッチするファイルが検索されます。
# locate httpd.conf /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.bak |
locate コマンドは、ワイルドカード「*」を使用する事もできます。
# locate *td.conf /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.bak /etc/xinetd.conf |
updatedb の設定ファイルは、/etc/updatedb.conf で設定します。updatedb
コマンドは、この設定ファイルがないと、CD-ROM内のファイルや、/tmp フォルダなどの一時的に作成されるファイルまでデータベースに含めてしまいます。しかし、CD-ROMなどのファイルまでデータベースに含めてしまうと、CD-ROMを取り除いたときには、存在しないファイルとして検索される事になってしまいます。この問題をさけるために、このupdatedb.conf ファイルで updatedb の対象から除外するファイルシステム、もしくは、ディレクトリへのパスを記述しておきます。記述の仕方は単純で、変数を定義し、それを適用するために、export コマンドを記述しておくだけです。もし、ここで指定されていないもので、updatadb コマンドの対象からはずしたいものがあれば、追記しておくとよいでしょう。
PRUNEFS="devpts
NFS nfs afs sfs proc smbfs autofs auto iso9660" PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /net /sfs" export PRUNEFS export PRUNEPATHS |
www.it-shikaku.jp